const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');

// 读取配置文件
let config;
try {
  const configPath = path.join(__dirname, 'config-images-to-gif.json');
  config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
  console.log('✅ 配置文件加载成功');
} catch (error) {
  console.error('❌ 配置文件加载失败:', error.message);
  console.error('请确保config-images-to-gif.json文件存在且格式正确');
  process.exit(1);
}

class ImagesToGifConverter {
  constructor(config) {
    this.config = config;
    this.checkFfmpegConfig();
  }

  // 检查ffmpeg配置
  checkFfmpegConfig() {
    // 验证ffmpeg路径是否存在
    if (!fs.existsSync(this.config.ffmpegPath)) {
      console.error(`❌ 错误: 找不到ffmpeg.exe文件: ${this.config.ffmpegPath}`);
      console.error('请检查路径是否正确，确保文件存在');
      process.exit(1);
    }
  }

  // 获取目录下的所有图片文件并按名称排序
  getSortedImages() {
    if (!fs.existsSync(this.config.framesDir)) {
      console.error(`❌ 错误: 图片目录不存在: ${this.config.framesDir}`);
      process.exit(1);
    }

    // 读取目录中的所有PNG文件
    const files = fs.readdirSync(this.config.framesDir)
      .filter(file => file.toLowerCase().endsWith('.png'))
      .sort((a, b) => {
        // 按文件名称排序，确保帧顺序正确
        return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
      });

    if (files.length === 0) {
      console.error(`❌ 错误: 目录中没有PNG图片文件: ${this.config.framesDir}`);
      process.exit(1);
    }

    console.log(`✅ 找到 ${files.length} 张图片`);
    return files;
  }

  // 将图片转换为GIF
  convertToGif() {
    const images = this.getSortedImages();

    // 获取第一张图片的名称前缀
    const firstImage = images[0];
    const prefix = firstImage.substring(0, firstImage.lastIndexOf('-'));

    // 计算实际帧率（考虑速度倍率）
    const actualFps = Math.max(1, this.config.frameRate * this.config.speed);

    // 生成GIF文件名，使用图片前缀
    const outputGif = path.join(this.config.outputDir, `${prefix}.gif`);

    console.log(`\n=== 开始转换为GIF ===`);
    console.log(`图片目录: ${this.config.framesDir}`);
    console.log(`图片前缀: ${prefix}`);
    console.log(`输出GIF: ${outputGif}`);
    console.log(`基础帧率: ${this.config.frameRate}fps`);
    console.log(`速度倍率: ${this.config.speed}x`);
    console.log(`实际帧率: ${actualFps}fps`);
    console.log(`缩放尺寸: ${this.config.scale}`);

    // 构建ffmpeg命令
    const inputPattern = path.join(this.config.framesDir, `${prefix}-%02d.png`);
    const ffmpegCommand = `"${this.config.ffmpegPath}" -framerate ${actualFps} -i "${inputPattern}" -vf scale=${this.config.scale} -c:v gif -loop 0 "${outputGif}"`;

    try {
      console.log('\n正在执行ffmpeg命令...');
      execSync(ffmpegCommand, { stdio: 'inherit' });
      console.log('\n✅ GIF转换完成!');
      console.log(`GIF文件已保存到: ${outputGif}`);
    } catch (error) {
      console.error('\n❌ GIF转换失败:', error.message);
      process.exit(1);
    }
  }
}

// 运行
function main() {
  try {
    const converter = new ImagesToGifConverter(config);
    converter.convertToGif();
  } catch (error) {
    console.error('\n❌ 程序执行失败:', error.message);
    process.exit(1);
  }
}

main();